package model

import (
	"time"

	"gorm.io/gorm"
)

// UserRole 用户角色关联模型
// 用于处理用户和角色之间的多对多关系
type UserRole struct {
	ID        uint           `gorm:"primarykey" json:"id"` // 关联记录ID，主键
	CreatedAt time.Time      `json:"created_at"`           // 记录创建时间
	UpdatedAt time.Time      `json:"updated_at"`           // 记录更新时间
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`       // 软删除时间

	UserID uint `gorm:"not null" json:"user_id"` // 用户ID
	RoleID uint `gorm:"not null" json:"role_id"` // 角色ID
}

// 通过用户ID获取权限列表
func GetUserPermissions(userID uint) []string {
	// 获取用户角色ID
	var roleIDs []uint
	DB.Model(&UserRole{}).
		Where("user_id = ?", userID).
		Pluck("role_id", &roleIDs)

	// 根据角色ID获取权限列表
	// 这里是模拟实现，实际应用中应该根据角色ID从数据库中查询对应的权限
	// 不同角色对应不同的权限列表
	permissions := []string{}

	// 模拟权限映射
	permissionMap := map[uint][]string{
		1: {"attendance:check-in", "attendance:check-out", "salary:view"}, // 普通员工权限
		2: {"employee:view", "employee:edit", "department:view"},          // 部门经理权限
		3: {"employee:create", "employee:delete", "salary:calculate"},     // HR权限
		4: {"system:admin", "role:manage"},                                // 管理员权限
	}

	// 合并所有角色的权限
	for _, roleID := range roleIDs {
		if perms, exists := permissionMap[roleID]; exists {
			permissions = append(permissions, perms...)
		}
	}

	// 去重
	unique := make(map[string]bool)
	var result []string
	for _, perm := range permissions {
		if !unique[perm] {
			unique[perm] = true
			result = append(result, perm)
		}
	}

	return result
}

// GetUserRoles 通过用户ID获取角色列表
func GetUserRoles(userID uint) []Role {
	// 获取用户的所有角色
	var roles []Role
	DB.Model(&Role{}).
		Joins("JOIN user_roles ON roles.id = user_roles.role_id").
		Where("user_roles.user_id = ?", userID).
		Find(&roles)

	return roles
}
